#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

//进程等待
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        exit(1);//标识进程运行完毕，结果不正确
    }
    else if (id == 0)
    {
        //子进程
        int cnt = 5;
        while (cnt)
        {
            printf("cnt:%d,我是子进程,pid: %d, ppid: %d\n",cnt,getpid(),getppid());
            sleep(1);
            cnt--;

           // int a = 10;
           // a /= 0; //让程序异常，检测信号编号
            
            int *p = NULL;
            *p = 1234;//让程序异常，检测信号编号
        }

        exit(177);
    }
    else
    {
        //父进程
        
        printf("我是父进程,pid: %d, ppid: %d\n",getpid(),getppid());
        
        //sleep(7);
        //pid_t ret = wait(NULL);//阻塞式的等待！
        int status = 0;
        pid_t ret = waitpid(id,&status,0);
        if (ret > 0)
        {
            //0x7F -> 0000 000 111 1111 前面清零，保留最低的7个bit位
            printf("等待子进程成功,ret:%d,子进程收到的信号编号：%d, 子进程退出码: %d\n",ret,status & 0x7F,(status >> 8) & 0xFF);//0xff -> 0000 0000  1111 1111  就拿到了子进程的退出码
        }

      //  //基本没有意义，方便对比
      //   while(1)
      //   {
      //       printf("我是父进程，pid: %d, ppid: %d\n",getpid(),getppid());
      //       sleep(1);
      //   }
    }
}




//int main()
//{
//
//    printf("你可以看见我吗？");//没有\n，数据会在缓冲区中，不会马上刷新出来
//    sleep(3);
//    _exit(13);//_exit在退出时，不会管缓冲的数据
//}





//main函数的返回值的意义？

//int sum(int top)
//{
//    int s = 0;
//    int i = 1;
//    while (i <= top)
//    {
//        s += i;
//        i++;
//    }
//    //return s;
//    //exit(222);
//    _exit(222);
//}
//int main()
//{
//    printf("heloo world1\n");
//    printf("heloo world1\n");
//    printf("heloo world1\n");
//    int res = sum(10);
//    
//    _exit(111);
//    // exit(111);
//   // return 11;
//
//    printf("heloo world2\n");
//    printf("heloo world2\n");
//    printf("heloo world2\n");
//    printf("heloo world2\n");
//
//  //  printf("hello world1\n");
//  //  printf("hello world1\n");
//  //  printf("hello world1\n");
//  //  int *p = NULL;
//  //  *p = 1234; //程序崩溃，野指针
//  //  printf("hello world2\n");
//  //  printf("hello world2\n");
//  //  printf("hello world2\n");
//
//   // int number = 0;
//   // while(number < 150)
//   // {
//   //     //打印错误退出码的原因
//   //     printf("%d:%s\n",number,strerror(number));
//   //     number++;
//   // }
//
////    int ret = 0;
////    printf("hello world: pid:%d,ppid:%d\n",getpid(),getppid());
////    int res = sum(100);
////    if (res != 5050)
////    {
////        //代码将来运行的结果不正确
////        ret = 1;//运行结果不正确
////    }
////    return ret;
//}
